'''
单例模式定义：确保只有一个特定类型的对象，并提供全局访问点。
单例模式意图:
    确保类且只有一个类被创建，
    为对象提供一个访问点，使得全局程序都访问该对象
    控制共享资源的并行访问
单例模式的缺点:
    全局变量可能在某处已经被误改了，但开发人员却认为没有修改，该变量在应用程序但其他位置被使用。
    可能会对同一个对象创建多个引用，单例模式只创建了一个对象，故此会发生改情况。
    所有依赖与全局变量的类 会因为一个类的改变而紧密耦合为全局变量，从而可能在无意中影响另外一个类。
实现逻辑: 使得构析函数私有化，并创建一个静态方法来完成对象初始化，这样对象第一次创建的时候调用，剩下都在调用之前创建的对象。
'''


class A():
    def __init__(self):
        pass
# python 自带方法 hasattr 用来检测类是否拥有某个属性
print(hasattr(A, 'instance'))
a = A()
print(hasattr(A, 'instance'))
print(A.instance)

'''
单例中的懒汉实例化
    在导入模块的时候 我们可能会无意中创建一个对象 但是在当时根本用不到它，懒汉实例化能够确保需要的时候才能创建对象，
'''
class Singleton():
    __instance = None
    def __init__(self):
        if not Singleton.__instance:
            print("cls init ing")
        else:
            print("cls is created")


    @classmethod
    def getInstance(cls):
        if not Singleton.__instance:
            cls.__instance = Singleton()
        else:
            return cls.__instance

'''
模块级别的单例:
    默认情况下，所有模块都是单例，这是由python的导入行为所决定的
    python工作方式如下:
        1. 检查一个python模块是否导入
        2. 如果已经导入 则返回该模块的对象，否则 导入该模块 并实例化该模块
        3. 因此当模块进行导入的时候 它就会被初始化， 然而同一个模块被多次导入的时候它就不会被初始化
'''


